'Шпоночные пазы внутренние
'Автор Ivanov

'###############################################	Закомментить в релизе - начало
'DrawType = 1 'Вид: 1 - спереди, 5 - сверху

'b = 10 'Ширина паза
'h = 9  'Высота паза
'l = 20 'Длина

'PAR_Step = 1
'###############################################	Закомментить в релизе - конец

Dim Dims

if DETAIL_LEVEL = GCV_EXTENDED then
	Dims = true
else
	Dims = false
end if

Dim tlarr,tl,tiarr,ti,vp,ltvar, dimText,lDimSource,dimDrawing,aDimSource,lDimParam,aDimParam,rDimDrawing,rDimSource,rDimParam

Const ko_ViewParam 			= 8
Const ko_TextLineParam 		= 29
Const ko_TextItemParam 		= 31
Const ko_DimText 			= 42
Const ko_LDimSourceParam 	= 43
Const ko_DimDrawing 		= 44
Const ko_LDimParam 			= 45
Const ko_ADimSourceParam 	= 49
Const ko_ADimParam 			= 50
Const ko_RDimSourceParam 	= 52
Const ko_RDimDrawing		= 53
Const ko_RDimParam			= 54
Const ko_LtVariant			= 108
Const TEXT_LINE_ARR = 3
Const TEXT_ITEM_ARR = 4
Const PI = 3.1415926535897931

Set tlarr = Kompas.GetDynamicArray(TEXT_LINE_ARR)
Set tiarr = Kompas.GetDynamicArray(TEXT_ITEM_ARR)
set tl = Kompas.GetParamStruct(ko_TextLineParam)
Set ti = Kompas.GetParamStruct(ko_TextItemParam)
Set dimText = Kompas.GetParamStruct(ko_DimText)
Set lDimSource = Kompas.GetParamStruct(ko_LDimSourceParam)
Set dimDrawing = Kompas.GetParamStruct(ko_DimDrawing)
Set lDimParam = Kompas.GetParamStruct(ko_LDimParam)
Set aDimSource = Kompas.GetParamStruct(ko_ADimSourceParam)
Set aDimParam = Kompas.GetParamStruct(ko_ADimParam)
Set rDimDrawing = Kompas.GetParamStruct(ko_RDimDrawing)
Set rDimSource = Kompas.GetParamStruct(ko_RDimSourceParam)
Set rDimParam = Kompas.GetParamStruct(ko_RDimParam)

' +++++
' ”ункциЯ длЯ отрисовки линейных размеров
' Џараметры по порЯдку:
' x1, y1 - координаты первой точки привЯзки
' x2, y2 - координаты второй точки привЯзки
' dx, dy - вектор ножки
' n1sh, n2sh - признак отображениЯ соответственно первой и второй ножки
' n1arr, n2arr - тип стрелки соответственно первой и второй ножки
' sign - тип условного значка перед номиналом размера
' text - текст(если будет передан 0, размер будет вычислЯтьсЯ автоматически)
' textBase - параметр отрисовки текста
' textPos - положение текста
' basePoint - параметр, показывающий от какой точки отмерЯть вектор ножки, 1 - от первой, 2 - от второй
' sDir - направление полки
' nLength - длина ножки полки
' nAng - направление ножки полки
SUB LinDimension (x1, y1, x2, y2, dx, dy, n1sh, n2sh, n1arr, n2arr, sign, text, textBase, textPos, basePoint, sDir, nLength, nAng)

	dimText.Init true
	dimDrawing.Init
	lDimSource.Init
	ti.Init
	tl.Init

	'-----------------------
	lDimSource.x1 = x1
	lDimSource.y1 = y1

	lDimSource.x2 = x2
	lDimSource.y2 = y2
	
	lDimSource.basePoint = basePoint
	lDimSource.ps = 3
	
	lDimSource.dx = dx
	lDimSource.dy = dy
	
	'------------------------
	dimDrawing.pt1 = n1arr
	dimDrawing.pt2 = n2arr
	
	dimDrawing.pl1 = n1sh
	dimDrawing.pl2 = n2sh
	
	dimDrawing.lenght = nLength
	
	dimDrawing.ang = nAng
	dimDrawing.shelfDir = sdir
	dimDrawing.textBase = textBase
	dimDrawing.textPos = textPos
	
	'------------------------
	IF (text <> 0) THEN
		tiarr.ksClearArray
		tlarr.ksClearArray
		ti.s = text
		tiarr.ksAddArrayItem -1, ti
		tl.SetTextItemArr tiarr
		tl.style = 1
		tlarr.ksAddArrayItem -1, tl

		dimText.SetTextArr tlarr
		dimText.bitFlag = 0
	ELSE
		dimText.bitFlag = 1
	END IF
	dimText.sign = sign
	
	'-------------------------
	lDimParam.SetTPar dimText
	lDimParam.SetDPar dimDrawing
	lDimParam.SetSPar lDimSource

	doc.ksLinDimension lDimParam
END SUB

' ”ункциЯ длЯ отрисовки диаметральных размеров
' Џараметры по порЯдку:
' xc, yc - координаты центра
' rad - радиус
' textPos - длина ножки
' nAng - угол наклона ножки
' sd - направление выносной полки
' n1arr, n2arr - типы стрелок
SUB DiamDimension (xc, yc, rad, sign, text, textPos, nAng, sd, n1arr, n2arr)

	dimText.Init true
	rDimDrawing.Init
	rDimSource.Init

	'-----------------------
	rDimSource.xc = xc
	rDimSource.yc = yc
	
	rDimSource.rad = rad
	'------------------------
	rDimDrawing.pt1 = n1arr
	rDimDrawing.pt2 = n2arr

	rDimDrawing.textPos = textPos
	rDimDrawing.ang = nAng

	rDimDrawing.shelfDir = sd

	'------------------------
	IF (text <> 0) THEN
		tiarr.ksClearArray
		tlarr.ksClearArray
		ti.s = text
		tiarr.ksAddArrayItem -1, ti
		tl.SetTextItemArr tiarr
		tl.style = 1
		tlarr.ksAddArrayItem -1, tl

		dimText.SetTextArr tlarr
		dimText.bitFlag = 0
	ELSE
		dimText.bitFlag = 1
	END IF
	dimText.sign = sign

	'-------------------------
	rDimParam.SetTPar dimText
	rDimParam.SetDPar rDimDrawing
	rDimParam.SetSPar rDimSource

	doc.ksDiamDimension rDimParam

END SUB

' ”ункциЯ длЯ отрисовки угловых размеров
' Џараметры по порЯдку:
' xc, yc - координаты центра
' ang1, ang2 - углы наклона соответственно первой и второй прЯмых угла
' rad - радиус дуги размера угла
' nLen - длина ножки
' nAng - угол наклона ножки
' shelfDir - направление выносной полки
' extFlag - флаг доболнительных возможностей
' x1, y1 - координаты начала первой ножки
' x2, y2 - координаты начала второй ножки
' text - текст размера
SUB AngDimension (xc, yc, ang1, ang2, rad, nLen, nAng, shelfDir, extFlag, x1, y1, x2, y2, text)

	dimText.Init true
	dimDrawing.Init
	aDimSource.Init

	'-----------------------
	aDimSource.xc = xc
	aDimSource.yc = yc
	
	aDimSource.x1 = x1
	aDimSource.y1 = y1

	aDimSource.x2 = x2
	aDimSource.y2 = y2
	
	aDimSource.ang1 = ang1
	aDimSource.ang2 = ang2
	
	aDimSource.rad = rad
	'------------------------
	dimDrawing.pt1 = 1
	dimDrawing.pt2 = 1
	
	dimDrawing.lenght = nLen
	dimDrawing.ang = nAng
	dimDrawing.shelfDir = shelfDir

	'------------------------
	dimText.SetBitFlagValue 1, true
	tlarr.ksClearArray
	
	If text <> 0 Then
		tiarr.ksClearArray
		ti.s = text 
		ti.s = ti.s + "Ў"
		tiarr.ksAddArrayItem -1, ti
		tl.SetTextItemArr tiarr
		tl.style = 1
		tlarr.ksAddArrayItem -1, tl
		
		dimText.SetBitFlagValue 1, false
	End If

	If extFlag = 1 Then 'добавление суффикса MAX
		tiarr.ksClearArray
		ti.s = " max"
		tiarr.ksAddArrayItem -1, ti
		tl.SetTextItemArr tiarr
		tl.style = 1
		tlarr.ksAddArrayItem -1, tl

		dimText.SetBitFlagValue 128, true
	End If

	dimText.SetTextArr tlarr
	'-------------------------
	aDimParam.SetTPar dimText
	aDimParam.SetDPar dimDrawing
	aDimParam.SetSPar aDimSource

	doc.ksAngDimension aDimParam

END SUB

' ”ункциЯ длЯ отрисовки радиальных размеров(без ответвлений)
' Џараметры по порЯдку:
' xc, yc - координаты центра
' rad - радиус
' textPos - длина ножки
' nAng - угол наклона ножки
' sd - направление выносной полки
' n1arr, n2arr - типы стрелок
SUB RadDimension (xc, yc, rad, textPos, nAng, sd, n1arr, n2arr)

	dimText.Init true
	rDimDrawing.Init
	rDimSource.Init

	'-----------------------
	rDimSource.xc = xc
	rDimSource.yc = yc
	
	rDimSource.rad = rad
	'------------------------
	rDimDrawing.pt1 = n1arr
	rDimDrawing.pt2 = n2arr

	rDimDrawing.textPos = textPos
	rDimDrawing.ang = nAng

	rDimDrawing.shelfDir = sd

	'------------------------
	dimText.bitFlag = 1
	dimText.sign = 3
	
	'-------------------------
	rDimParam.SetTPar dimText
	rDimParam.SetDPar rDimDrawing
	rDimParam.SetSPar rDimSource

	doc.ksRadDimension rDimParam

END SUB

FUNCTION arcsin (x)
	arcsin = (180 * atn (x/(sqr(1 - x * x)))) / pi
END FUNCTION

' Функция для вычисления значения масштабирования
dim getScaleField

getScaleField = 0

set vp = Kompas.GetParamStruct(ko_ViewParam)
set ltvar = Kompas.GetParamStruct(ko_LtVariant)
set iter = Kompas.GetIterator
	
const ALLPARAM = -1
const VIEW_LAYER_STATE = 1
const VIEW_OBJ = 123

function GetScale ()
	if getScaleField = 0 then
		ef = false
		i = 0
		vp.Init
		ltvar.Init
		documentType = kompas.ksGetDocumentType(0)
		IF documentType <> 3 THEN 'фрагмент
			iter.ksCreateIterator VIEW_OBJ, 0
			ref = iter.ksMoveIterator ("F")
			IF ref <> 0 THEN 
				DO
					i = i + 1
					doc.ksGetObjParam ref, vp, ALLPARAM
					IF vp.state = 3 THEN 'текущий вид
						getScaleField = vp.scale_
						ef = true
					END IF
					ref = iter.ksMoveIterator ("N")
				LOOP WHILE (ref <> 0 and ef = false and i < 1000)
			END IF
		END IF
		IF getScaleField = 0 THEN getScaleField = 1
	end if
	getScale = getScaleField
end function

' Возвращает тип стрелки для линейных размеров по размеру
function GetArrowType (value)
	
	scale = GetScale
	if abs(value * scale) < 10 then
		GetArrowType = 2
	else
		GetArrowType = 1
	end if
	
end function

'+++++

Sub MainView(Contur)
	if Contur = 1 then
		Doc.ksColouring &HFE000000
	End if
	X1 = 0
	Y1 = h
	X2 = X1 + l
	Y2 = Y1
	X3 = 0
	Y3 = 0
	X4 = X3 + l

	Xb1 = X1
	Yb1 = Y1 + h/4
	Xb2 = X1 + l/4
	Yb2 = Y1 + h/3
	Xb3 = X1 + l/2
	Yb3 = Y1 + h/4
	Xb4 = X2 - l/4
	Yb4 = Y1 + h/6
	Xb5 = X2
	Yb5 = Y1 + h/4
	Doc.ksLineSeg X3, Y3, X4, Y4, 1
	Doc.ksLineSeg X3, Y3, Xb1, Yb1, 1
	Doc.ksLineSeg X4, Y4, Xb5, Yb5, 1
	Doc.ksBezier 0, 2
		Doc.ksPoint Xb1, Yb1, 0
		Doc.ksPoint Xb2, Yb2, 0
		Doc.ksPoint Xb3, Yb3, 0
		Doc.ksPoint Xb4, Yb4, 0
		Doc.ksPoint Xb5, Yb5, 0
	Doc.ksEndObj

	if Contur<>1 then
		Doc.ksLineSeg X1, Y1, X2, Y2, 1

		Doc.ksHatch 0, 45, PAR_STEP, 0, 0, 0
			Doc.ksLineSeg X1, Y1, X2, Y2, 1
			Doc.ksLineSeg X1, Y1, Xb1, Yb1, 1
			Doc.ksLineSeg X2, Y2, Xb5, Yb5, 1
			Doc.ksBezier 0, 2
				Doc.ksPoint Xb1, Yb1, 0
				Doc.ksPoint Xb2, Yb2, 0
				Doc.ksPoint Xb3, Yb3, 0
				Doc.ksPoint Xb4, Yb4, 0
				Doc.ksPoint Xb5, Yb5, 0
			Doc.ksEndObj
		Doc.ksEndObj
	End if

	if Contur = 1 then
		Doc.ksEndObj
	else
		if dims = true then
			
			scale = GetScale
			
			
			tArr = GetArrowType (x2 - x1)
			
			LinDimension x1, y1, x2, y2, 0, 10 + (h/3) * scale, false, false, tArr, tArr, 0, 0, 0, 0, 1, 0, 0, 0
			
			
			tArr = GetArrowType (y3 - y1)
			
			LinDimension x1, y1, x3, y3, - 10, 0, false, false, tArr, tArr, 0, 0, 0, 0, 1, 0, 0, 0
		end if
	End if
End Sub

Sub TopView(Contur)
	if Contur = 1 then
		Doc.ksColouring &HFE000000
	End if
	X1 = 0
	Y1 = b/2
	X2 = X1 + l
	Y2 = Y1
	X3 = X1
	Y3 = - Y1
	X4 = X2
	Y4 = - Y2

	Xb1 = X1
	Yb1 = Y1 + b/4
	Xb2 = X1 + l/4
	Yb2 = Y1 + b/3
	Xb3 = X1 + l/2
	Yb3 = Y1 + b/4
	Xb4 = X2 - l/4
	Yb4 = Y1 + b/6
	Xb5 = X2
	Yb5 = Y1 + b/4

	Xb6 = X1
	Yb6 = Y3 - b/4
	Xb7 = X1 + l/4
	Yb7 = Y3 - b/6
	Xb8 = X1 + l/2
	Yb8 = Y3 - b/4
	Xb9 = X2 - l/4
	Yb9 = Y3 - b/3
	Xb10 = X2
	Yb10 = Y3 - b/4

	Doc.ksLineSeg Xb1, Yb1, Xb6, Yb6, 1
	Doc.ksLineSeg Xb5, Yb5, Xb10, Yb10, 1

	Doc.ksBezier 0, 2
		Doc.ksPoint Xb1, Yb1, 0
		Doc.ksPoint Xb2, Yb2, 0
		Doc.ksPoint Xb3, Yb3, 0
		Doc.ksPoint Xb4, Yb4, 0
		Doc.ksPoint Xb5, Yb5, 0
	Doc.ksEndObj

	Doc.ksBezier 0, 2
		Doc.ksPoint Xb6, Yb6, 0
		Doc.ksPoint Xb7, Yb7, 0
		Doc.ksPoint Xb8, Yb8, 0
		Doc.ksPoint Xb9, Yb9, 0
		Doc.ksPoint Xb10, Yb10, 0
	Doc.ksEndObj

	if Contur<>1 then
		Doc.ksLineSeg X1, Y1, X2, Y2, 1
		Doc.ksLineSeg X3, Y3, X4, Y4, 1
	End if

	if Contur = 1 then
		Doc.ksEndObj
	else
		if dims = true then
		
			scale = GetScale
			
			tArr = GetArrowType (x2 - x1)

			LinDimension x1, y1, x2, y2, 0, 10 + (b / 3) * scale, false, false, tArr, tArr, 0, 0, 0, 0, 1, 0, 0, 0
			

			tArr = GetArrowType (y3 - y1)
			
			LinDimension x1, y1, x3, y3, - 10, 0, false, false, tArr, tArr, 0, 0, 0, 0, 1, 0, 0, 0
			
		end if
	End if
End Sub

Sub Script_OnLoad
	if DrawType = 1 then
		MainView(1)
		MainView(-1)
	End if

	if DrawType = 5 then
		TopView(1)
		TopView(-1)
	End if
End Sub
